//****************************************Copyright (c)***********************************//
//技术支持：www.openedv.com
//淘宝店铺：http://openedv.taobao.com
//关注微信公众平台微信号："正点原子"，免费获取FPGA & STM32资料。
//版权所有，盗版必究。
//Copyright(C) 正点原子 2018-2028
//All rights reserved
//----------------------------------------------------------------------------------------
// File name:           segled_register
// Last modified Date:  2018/08/01 14:23:22
// Last Version:        V1.0
// Descriptions:        数码管自定义IP核寄存器文件
//----------------------------------------------------------------------------------------
// Created by:          正点原子
// Created date:        2018/08/01 14:23:31
// Version:             V1.0
// Descriptions:        The original version
//
//----------------------------------------------------------------------------------------
//****************************************************************************************//

module segled_register(
    input                     clk          ,  // 时钟信号
    input                     rst_n        ,  // 复位信号（低有效）
    
    //Avalon-MM interface
    input           [ 1:0]    avs_address  ,  // Avalon 地址总线
    input                     avs_write    ,  // Avalon 写请求信
    input           [31:0]    avs_writedata,  // Avalon 写数据总线

    //user interface
    output    reg   [19:0]    data         ,  // 6个数码管要显示的数值
    output    reg   [ 5:0]    point        ,  // 小数点显示的位置,从左到右,高电平有效
    output    reg             sign         ,  // 显示符号位（高电平显示“-”号）
    output    reg             en              // 数码管使能信号
);

//*****************************************************
//**                    main code
//*****************************************************

//用于给数码管数据寄存器进行赋值
always @(posedge clk or negedge rst_n) begin
   if(!rst_n)
       data <= 20'd0;
   else if((avs_write) && (avs_address == 2'b00))
       data <= avs_writedata[19:0];            // 数码管显示的数据
end

//用于给数码管控制小数点显示寄存器进行赋值
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
         point <= 6'd0;
    else if((avs_write) && (avs_address == 2'b01))
         point <= avs_writedata[5:0];         // 小数点显示的位置,从左到右,高电平有效
end

//用于给数码管控制符号寄存器进行赋值
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
        sign <= 1'b0;
    else if((avs_write) && (avs_address == 2'b10))
        sign <= avs_writedata[0];            // 显示符号位（高电平显示“-”号）3
end

//用于给数码管使能寄存器进行赋值
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
        en <= 1'b0;
    else if((avs_write) && (avs_address == 2'b11))
        en <= avs_writedata[0];              // 数码管使能信号
end

endmodule